import {App, Notice, Plugin, PluginManifest} from 'obsidian';
import SampleSettingTab, {DEFAULT_SETTINGS, MyPluginSettings, 添加命令} from "./sjz/插件设置/插件设置页面配置";
import {史锦泽的搜索框} from "./sjz/常用功能/重要功能/史锦泽的搜索框/史锦泽的搜索框";
import {简单的弹框模板} from './sjz/弹框/简单的弹框模板';
import {解密文件输入密码的弹框} from "./sjz/常用功能/文件加密/史锦泽的搜索框";
import {打开常用文件命令} from "./sjz/常用功能/打开文件/命令打开文件";
import { 定时更新,
	新标签页打开常用文件
} from "./sjz/常用功能/重要功能/新标签页打开常用文件";
import {正则搜索文件} from "./sjz/常用功能/重要功能/正则搜索文件";
import {复制文件路劲功能} from "./sjz/常用功能/重要功能/复制文件路劲功能";
import {左侧边栏的按钮功能} from "./sjz/常用功能/简单示例/左侧边栏的按钮功能";
import {文件快捷输入命令} from "./sjz/常用功能/简单示例/文件快捷输入命令";
import {插件初始化需要最先执行} from "./sjz/常用功能/重要功能/初始化创建文件节";
import {第一次打开软件执行} from "./sjz/常用功能/重要功能/第一次打开软件执行";


export default class MyPlugin extends Plugin {
	recentFiles: string[];
    maxRecentFiles: number;
	fileOpenCounts: Record<string, number>;
	redisLock: Record<string, number>;
	recentTags: Record<string, number>;
	observer: MutationObserver | null = null;  // 明确声明 observer 的类型
	// ... 你现有的属性
	sessionId: string;
	lastSessionId: string;
	constructor(app: App, manifest: PluginManifest) {
        super(app, manifest);
        this.recentFiles = [];
		this.observer = null;
		this.maxRecentFiles = 5;
        this.fileOpenCounts = {}; // 存储文件打开次数的对象
        this.recentTags = {}; // 存储文件打开次数的对象
        this.redisLock = {}; // 存储文件打开次数的对象
		this.sessionId = Date.now().toString(); // 当前会话ID
		this.lastSessionId = '';
    }
	settings: MyPluginSettings;

	async onload() {
		//定时器
		this.registerInterval(
			window.setInterval(() => this.updateStatusBar(), 1000*60*3)
		);

		// 读取保存的数据
		const data = await this.loadData();
		// 初始设置
		this.settings = Object.assign({}, {
			filePath: 'path/to/your/file.md' // 默认路径
		}, await this.loadData());

		// 根据文件名添加常用文件(file.path,this_)
		// if (fs.existsSync(this_.settings.recentFileJson)) {
		// 	// 文件存在，读取数据
		// 	const dataFromFile = fs.readFileSync(this_.settings.recentFileJson, 'utf-8');
		// 	this_.fileOpenCounts = JSON.parse(dataFromFile);
		// }

		// 如果数据存在则使用它，否则初始化为一个空对象
		this.fileOpenCounts = data.fileOpenCounts || {};
		// 向插件添加一个设置选项卡,必要的
		this.addSettingTab(new SampleSettingTab(this.app, this));
		// 并在每次点击事件触发时执行回调函数。
		this.registerDomEvent(document, 'click', (evt: MouseEvent) => {
			// console.log('click', evt);
		});
		//当插件被禁用时，该函数将自动清除插件创建的（clear）定时器。
		this.registerInterval(window.setInterval(() => console.log('setInterval'), 5 * 60 * 1000));
		插件初始化需要最先执行(this)
		正则搜索文件(this)
		复制文件路劲功能(this)
		新标签页打开常用文件(this)
		添加命令(this)
		史锦泽的搜索框(this)
		简单的弹框模板(this)
		解密文件输入密码的弹框(this)
		打开常用文件命令(this)
		左侧边栏的按钮功能(this)
		文件快捷输入命令(this)
		// 给代码块添加复制功能,这个需要监听Dom树变化,可能比较消耗资源,并且导致死循环,所有有问题首先排查下面这个方法或者注释.
		// 给代码块添加复制功能(this)

		this.lastSessionId = this.settings.lastSessionId || '';
		// 检查是否是新会话
		if (this.lastSessionId !== this.sessionId) {
			console.log('检测到新的 Obsidian 会话，执行启动任务...');
			第一次打开软件执行(this)
			// 保存当前会话ID
			this.settings.lastSessionId = this.sessionId;
			await this.saveSettings();
		}
	}
	//onunload()在插件被禁用时运行。您的插件正在使用的任何资源都必须在此处释放，以避免在您的插件被禁用后影响 Obsidian 的性能。
	onunload() {

	}

	//定时任务
	updateStatusBar() {
		console.log("定时任务执行")
		定时更新(this)
	}


	async loadSettings() {
		this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
	}
	async saveSettings() {
		await this.saveData(this.settings);
	}
}
